跳到主要内容

数据模式(Schema)

数据模式(Schema)归属于数据库(Database)管理,它整合数据表以及其它的一些数据对象,可以视作为“数据表“(Table)的集合的超集。

schema

一般而言,我们更多的是与数据表打交道,而与数据模式对接工作则更多地发生于某些大型应用部署与卸载的时候。

创建数据模式

因为数据模式归属于数据库之中,是一个二级管理单元,因此 PostgreSQL 并没有为数据模式设立单独的数据应用程序(因此官方套件中,并不存在一个名为 createschema 的程序),而是选择将一切的操作,都放置于一条条 SQL 指令上面,参考如下代码:

/* 创建一个名为 example 的数据模式 */
CREATE SCHEMA example;

删除数据模式

删除数据模式,分两种情况讨论:

/* 
假定目标数据模式为 example
数据模式下面没有任何数据对象,即模式为空的情况
*/
DROP SCHEMA example;
/*
删除数据模式以及其涵盖的所有数据对象
*/
DROP SCHEME example CASCADE;

public 数据模式

在每一个新的数据库(Database)被创建的时候,一个配套的默认数据模式也会被创建(即 public),而我们即将介绍的创建数据表等情况,在不直接指定的情况下,将会归口到 public 下管理。

模式的搜索路径(Schema Search Path)

在阅读之前的篇章以后,相信你已经清楚,模式是一个二级管理单元,里面涵盖着很多的数据表,那么自然而然,指定一张数据表的方式就是:

数据库名.模式名.数据表名

如 postgres 数据库下的 example 模式下的 book 表,就应当写成:

postgres.example.book

这种写法,难免过于冗长,因此需要采取一定方法进行简化,让我们来做一个思考:

因为我们使用客户端连接 PostgreSQL 的时候,实际上已经指定了数据库的名称,因此实际上我们的每一条语句,就是围绕当前的数据库而展开的(包括模式的创建,实际上默认就归口到了当前的数据库之中),因此数据表的指定方式可以是:

模式名.数据表名

而再思考一下,假如我们希望直接通过数据表名查找到数据表,那么最好的措施,就是让 PostgreSQL 自己去了解到这个模式的名称,而 Schema Search Path(模式搜索路径),就发挥起了这个作用,它实际上就是一组模式名称的集合,在我们直接写出数据表名称的时候,PostgreSQL 将会自动尝试用搜索路径下面的模式名结合数据表名,进而去查找对应的对象,由此使得我们可以直接通过指定 数据表名 的方式来实现对于数据表的访问。

不足的是,如果在不同的模式下面出现了同名的数据表,它就会产生歧义,这种情况,就得要我们出面,直接指定是什么模式下面的什么表。

搜索路径是一个系统设置,因此操作它的方式不同于一般的数据表,请参考如下代码:

# 展示当前的搜索路径
SHOW search_path;
# 修订当前的搜索路径(假定为 public)
SET search_path TO 'public';
提示

设置搜索模式会直接覆盖已有的数据
PostgreSQL 的 SET 指令并非在原有基础上面加入新的数据,而是直接覆盖原有的数据,因此在设置 search_path 的时候(假定需求在于加入新的模式到现有的上面),方式就是先借助 SHOW 指令展现既有的搜索模式,之后将新的数据添加在上即可。 如果不幸覆盖既有设置,得益于 PostgreSQL 配置的实现原理(多版本管理),我们可以通过 RESET 指令重置,或者我们可以选择再次连接 PostgreSQL(search path 是一项运行时配置,在连接重置之后,将会自动恢复)。